// 运算符重载
#include <iostream>

class Vector
{
private:
    double x;
    double y;

public:
    // 构造函数
    // x(x), y(y) 是成员初始化列表
    // 括号外的x 和 y 是类的成员变量 括号内的参数 x 和 y 是构造函数的参数
    Vector(double x = 0, double y = 0) : x(x), y(y) {}

    // 友元函数声明
    friend Vector operator+(const Vector &v1, const Vector &v2);

    // 友元函数的好处是 可以直接访问类的私有成员
    // 重载数乘运算时 a * vector和 vector * a 都可以使用
    // 普通重载则简洁的一次实现这一功能
    Vector operator*(double a) const;  // 实现vec * a的重载
    friend Vector operator*(double a, const Vector &v); // 实现a * vec的重载
    // 输出矢量信息的函数
    void print() const
    {
        std::cout << "(" << x << ", " << y << ")" << std::endl;
    }
};
// 第一个Vector是返回类型 第二个是作用域
Vector Vector::operator*(double a) const
{
    return Vector(x * a, y * a);
}
// 友元函数实现数乘
Vector operator*(double a, const Vector &v)
{
    return v.operator*(a); // 调用成员函数
}

// 友元函数定义 注意只有声明的时候写friend
Vector operator+(const Vector &v1, const Vector &v2)
{
    return Vector(v1.x + v2.x, v1.y + v2.y);
}

int main()
{
    Vector v1(1, 2);
    Vector v2(3, 4);

    // 调用重载的加法运算符
    Vector v3 = v1 + v2;

    std::cout << "Vector 1: ";
    v1.print();
    std::cout << "Vector 2: ";
    v2.print();
    std::cout << "Vector 1 + Vector 2: ";
    v3.print();
    // 调用重载的数乘运算符
    Vector v4 = v1 * 2;
    std::cout << "Vector 1 * 2: ";
    v4.print();
    Vector v5 = 2 * v1;
    std::cout << "2 * Vector 1: ";
    v5.print();

    return 0;
}